package com.gpj.sqlbuilder.sysfun;

import com.gpj.sqlbuilder.enums.ColumnType;
import com.gpj.sqlbuilder.enums.PrimaryType;
import com.gpj.sqlbuilder.store.sql.Column;
import com.gpj.sqlbuilder.store.sql.Data;
import com.gpj.sqlbuilder.store.sql.Table;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @className SystemFunction
 * @description
 *   TODO
 * @author GPJ
 * @date 2021/3/30 16:49
 * @version 1.0
 **/
@Slf4j
public class SystemFunction {
	public static String dataFormat(Table table, Data data, Integer index){
		String value = data.getColumnValue().get(index);
		return dataFormat(table, value, index, "NULL");
	}

	public static String dataFormat(Table table, String value, Integer index, String blankValue){
		if(StringUtils.isBlank(value)){
			return blankValue;
		}else if(StringUtils.equals(value.toUpperCase(), "NULL")){
			return "NULL";
		}else if(table.getColumns().get(index).isStringValue()){
			return "'" + value + "'";
		}
		return value;
	}

	public static boolean isEnd(ArrayList columns, Integer index){
		return index == (columns.size() - 1);
	}

	/**
	 * 解析字段类型,转为数据库字段
	 */
	public static String columnType(Column column){
		return columnSqlBuild(column);
	}

	private static String columnSqlBuild(Column column){
		if(column == null || column.getType() == null) return "";

		ColumnType type = column.getType();
		StringBuffer sql = new StringBuffer(type.getCode());
		int length = column.getLength() > 0?column.getLength():type.getDefaultLength();
		int accuracy = column.getAccuracy() >= 0?column.getAccuracy():type.getDefaultAccuracy();
		if(length > 0){
			sql.append("(").append(length);
			if(accuracy > 0){
				sql.append(",").append(accuracy);
			}
			sql.append(")");
		}
		return sql.toString();
	}

	/**
	 * 判断待检查参数是否为true,是则返回true,否则返回false
	 * @param param  待检查参数
	 * @param expected 预期值
	 */
	public static boolean scales(String param, String expected){
		return StringUtils.equals(param, expected);
	}


	/**
	 * 判断待检查参数是否为true,是则输出第二个参数;否则输出第三个参数
	 * @param value 待检查参数
	 * @param trueValue 真值输出
	 * @param falseValue 假值输出
	 */
	public static String scales(Boolean value, String trueValue, String falseValue){
	    return value?trueValue:falseValue;
	}

	/**
	 * 判断待检查参数是否为与预期参数一致,是则输出第二个参数;否则输出第三个参数
	 * @param param  待检查参数
	 * @param expected 预期值
	 * @param trueValue 真值输出
	 * @param falseValue 假值输出
	 */
	public static String scales(String param, String expected, String trueValue, String falseValue){
		return StringUtils.equals(param, expected)?trueValue:falseValue;
	}

	/**
	 * 判断待检查参数是否为true,是则输出第二个参数;否则输出第三个参数
	 * @param value 待检查参数
	 * @param trueValue 真值输出
	 * @param falseValue 假值输出
	 */
	public static String isBlank(String value, String trueValue, String falseValue){
		return StringUtils.isBlank(value)?trueValue:falseValue;
	}

	/**
	 * 检查集合是否为空
	 * @param list 待检查集合对象
	 */
	public static boolean isEmpty(ArrayList list){
	    return list == null || list.isEmpty();
	}

	/**
	 * 检查集合是否不为空
	 * @param list 待检查集合对象
	 */
	public static boolean isNotEmpty(ArrayList list){
		return !isEmpty(list);
	}

	/**
	 * 检查集合是否为空
	 * @param map 待检查集合对象
	 */
	public static boolean isEmpty(HashMap map){
		return map == null || map.isEmpty();
	}

	/**
	 * 检查集合是否不为空
	 * @param map 待检查集合对象
	 */
	public static boolean isNotEmpty(HashMap map){
		return !isEmpty(map);
	}

	/**
	 * 判断待检查参数是否为以预期参数开头,是则返回true;否则返回falsse
	 * @param param  待检查参数
	 * @param expected 预期值
	 */
	public static boolean startWithout(String param, String expected){
		return !param.startsWith(expected);
	}

	/**
	 * 判断是否为自增主键,是则输出第二个参数;否则输出第三个参数
	 * @param value 待检查参数
	 * @param trueValue 真值输出
	 * @param falseValue 假值输出
	 */
	public static String autoIncrement(PrimaryType value, String trueValue, String falseValue){
		return (value == PrimaryType.AUTO)?trueValue:falseValue;
	}
}
